Run Date: 19 August 2025

Introduction

This reads the various directories for CSVs in different stages, checks the files and combines them. Issues with files or data are reported, and total counts of files and rows added are listed. There are different folders checked here in different phases of

Before stitching files together, review and correct raw data files (e.g. species CSV file), using the notebook L0_file_review.rmd

The code here saves the file in the Data folder in L0 in the configuration of filepaths.R. see below

Setup

First, setup the folders and files from configuration and check them

File paths used for this run:

file_paths
$DATA_FOLDER
[1] "/Users/billspat/tmp/Avian-Interaction-Database-Working"

$SYNC_DATA_FOLDER
[1] "/Users/billspat/Library/CloudStorage/GoogleDrive-billspat@msu.edu/Shared drives/Avian_MetaNetwork/data/L0/avian_intxn_data"

$L0
[1] "/Users/billspat/tmp/Avian-Interaction-Database-Working/L0"

$L1
[1] "/Users/billspat/tmp/Avian-Interaction-Database-Working/L1"

Processing CSVs

There are three main data folders for data files in different states. For each state, collect the list of files and o

1 Fully Checked CSV files for a species. intxnsL0sp

csv_file_group_name='checked'
csv_file_path = file.path(file_paths$L0, "species")
# filter or add in google drive files here
checked_file_list <- list.files(path = csv_file_path , pattern = ".*\\.csv", 
  full.names = TRUE)

paste(csv_file_path, ":", csv_file_group_name, "files to process", length(checked_file_list))
[1] "/Users/billspat/tmp/Avian-Interaction-Database-Working/L0/species : checked files to process 870"

Stitching Files together:


intxnsL0sp <- L0_stitch(
                csv_file_list = checked_file_list, 
                csv_file_group_name = csv_file_group_name
                )

# intxnsL0sp is a list with several items to track counts of things and files
# see L0_functions.R for details
[1] "Rows in stitched file: 26372"

Optionally examine the full stitched data frame:

[1] "Count of species after binding: 1228"

Comparison of Pre- and Post-Binding Values:

Comparison of Pre- and Post-Binding Values

Column: n_studies 
Pre-Binding Summary:
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
  0.000   1.000   1.000   1.572   2.000  36.000    6673 
Post-Binding Summary:
Length  Class   Mode 
     0   NULL   NULL 
Pre-Binding Unique Counts:
all_values
    0     1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17    18    19    20    22    24    25    36  <NA> 
 1244 12507  3084  1525   580   348   163    93    49    73    11    10    19     9     5     5     5     1     2     1     4     1     1     1     1  6673 
Post-Binding Unique Counts:
< table of extent 0 >

Column: effect_sp1_on_sp2 
Pre-Binding Summary:
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-1.0000 -1.0000  0.0000  0.0414  1.0000  1.0000      37 
Post-Binding Summary:
Length  Class   Mode 
     0   NULL   NULL 
Pre-Binding Unique Counts:
all_values
   -1     0     1  <NA> 
10341  4604 11433    37 
Post-Binding Unique Counts:
< table of extent 0 >

Column: effect_sp2_on_sp1 
Pre-Binding Summary:
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-1.0000 -1.0000  0.0000  0.1418  1.0000  1.0000      38 
Post-Binding Summary:
Length  Class   Mode 
     0   NULL   NULL 
Pre-Binding Unique Counts:
all_values
   -1     0     1  <NA> 
 9049  4539 12789    38 
Post-Binding Unique Counts:
< table of extent 0 >

2 not fully Checked Species in BBS intxnsL0sptemp

csv_file_group_name='species_temp'
csv_file_path = file.path(file_paths$L0, "species_temp")
# filter or add in google drive files here
temp_file_list <- list.files(path = csv_file_path , pattern = ".*\\.csv", 
  full.names = TRUE)

paste(csv_file_path, ":", csv_file_group_name, "files to process",  length(temp_file_list)) 
[1] "/Users/billspat/tmp/Avian-Interaction-Database-Working/L0/species_temp : species_temp files to process 39"

intxnsL0sptemp <- L0_stitch(
                    csv_file_list = temp_file_list, 
                    csv_file_group_name=csv_file_group_name
                    )
paste("Count of species after binding",intxnsL0sptemp$count)
[1] "Count of species after binding 170"
Comparison of Pre- and Post-Binding Values

Column: n_studies 
Pre-Binding Summary:
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
  1.000   1.000   1.000   1.553   2.000  24.000    1168 
Post-Binding Summary:
Length  Class   Mode 
     0   NULL   NULL 
Pre-Binding Unique Counts:
all_values
   1    2    3    4    5    6    7    8    9   10   11   14   24 <NA> 
1662  421  172   67   31   24    3    2    3    1    1    1    1 1168 
Post-Binding Unique Counts:
< table of extent 0 >

Column: effect_sp1_on_sp2 
Pre-Binding Summary:
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
-1.00000 -1.00000  0.00000 -0.06363  1.00000  1.00000        5 
Post-Binding Summary:
Length  Class   Mode 
     0   NULL   NULL 
Pre-Binding Unique Counts:
all_values
  -1    0    1 <NA> 
1621  536 1395    5 
Post-Binding Unique Counts:
< table of extent 0 >

Column: effect_sp2_on_sp1 
Pre-Binding Summary:
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-1.0000  0.0000  1.0000  0.4237  1.0000  1.0000       5 
Post-Binding Summary:
Length  Class   Mode 
     0   NULL   NULL 
Pre-Binding Unique Counts:
all_values
  -1    0    1 <NA> 
 722  603 2227    5 
Post-Binding Unique Counts:
< table of extent 0 >

3 Data files (species) to be reviewed or in the process of being reviewed intxnsL0spir

csv_file_group_name='species_in_review'
csv_file_path = file.path(file_paths$L0, "species_in_review")
# filter or add in google drive files here
in_review_file_list <- list.files(path = csv_file_path , pattern = ".*\\.csv", 
  full.names = TRUE)

paste(csv_file_path, ":", csv_file_group_name, "files to process", length(in_review_file_list))
[1] "/Users/billspat/tmp/Avian-Interaction-Database-Working/L0/species_in_review : species_in_review files to process 292"

intxnsL0spir <- L0_stitch(
                  csv_file_list = in_review_file_list, 
                  csv_file_group_name=csv_file_group_name
                  ) 
G2;H2;Warningh: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
  dat <- vroom(...)
  problems(dat)g
[1] "/Users/billspat/tmp/Avian-Interaction-Database-Working/L0/species_in_review/Cynanthus_ doubledayi_AJ.csv"
G2;H2;Warningh: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
  dat <- vroom(...)
  problems(dat)g
[1] "/Users/billspat/tmp/Avian-Interaction-Database-Working/L0/species_in_review/Micrastur_ruficollis_CR.csv"
G2;H2;Warningh: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
  dat <- vroom(...)
  problems(dat)g
[1] "/Users/billspat/tmp/Avian-Interaction-Database-Working/L0/species_in_review/Pampa_ curvipennis_AJ.csv"
G2;H2;Warningh: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
  dat <- vroom(...)
  problems(dat)g
[1] "/Users/billspat/tmp/Avian-Interaction-Database-Working/L0/species_in_review/Rhynchocyclus_brevirostris_AJ.csv"
G2;H2;Warningh: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
  dat <- vroom(...)
  problems(dat)g
[1] "/Users/billspat/tmp/Avian-Interaction-Database-Working/L0/species_in_review/Saucerottia_ beryllina_AJ.csv"
G2;H2;Warningh: The following named parsers don't match the column names: OLDsourceA, OLDsourceB, sourceAupdatedURL, sourceBupdatedURL, sourceCupdatedURL, sourceDupdatedURLg
G2;H2;Warningh: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
  dat <- vroom(...)
  problems(dat)g
[1] "/Users/billspat/tmp/Avian-Interaction-Database-Working/L0/species_in_review/Streptoprocne_zonaris_AJ.csv"
G2;H2;Warningh: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
  dat <- vroom(...)
  problems(dat)g
[1] "/Users/billspat/tmp/Avian-Interaction-Database-Working/L0/species_in_review/Tachycineta_ albilinea_AJ.csv"
G2;H2;Warningh: The following named parsers don't match the column names: OLDsourceA, OLDsourceB, sourceAupdatedURL, sourceBupdatedURL, sourceCupdatedURL, sourceDupdatedURLg
G2;H2;Warningh: The following named parsers don't match the column names: OLDsourceA, OLDsourceB, sourceAupdatedURL, sourceBupdatedURL, sourceCupdatedURL, sourceDupdatedURLg
[1] "Count of species after binding: 853"
Comparison of Pre- and Post-Binding Values

Column: n_studies 
Pre-Binding Summary:
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
  0.000   1.000   1.000   1.102   1.000  10.000    5817 
Post-Binding Summary:
Length  Class   Mode 
     0   NULL   NULL 
Pre-Binding Unique Counts:
all_values
   0    1    2    3    4    5    6    7    9   10 <NA> 
 266 6818  227   65   46  114    9    4    1    1 5817 
Post-Binding Unique Counts:
< table of extent 0 >

Column: effect_sp1_on_sp2 
Pre-Binding Summary:
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
 -1.000   0.000   1.000   0.654   1.000   1.000      34 
Post-Binding Summary:
Length  Class   Mode 
     0   NULL   NULL 
Pre-Binding Unique Counts:
all_values
  -1    0    1 <NA> 
 898 2817 9619   34 
Post-Binding Unique Counts:
< table of extent 0 >

Column: effect_sp2_on_sp1 
Pre-Binding Summary:
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-1.0000  0.0000  1.0000  0.6659  1.0000  1.0000      34 
Post-Binding Summary:
Length  Class   Mode 
     0   NULL   NULL 
Pre-Binding Unique Counts:
all_values
  -1    0    1 <NA> 
 775 2905 9654   34 
Post-Binding Unique Counts:
< table of extent 0 >

Before saving the species to file, un-comment and run the following to merge the species and species_in_review interaction data into checked species. These are lists with the data frames in the element intxns

# echo both in-review and checked
# intxnsL0 <-rbind(intxnsL0sp$intxns, intxnsL0spir$intxns)
# or, do not echo in-review, only checked

intxnsL0 <- intxnsL0sp$intxns

Count of species in saved L0:

[1] 26372

Note that some species1 in a given species1 csv could also be other species because of entering many pair-wise interactions in, for example, mixed flock entry. Any duplicates will be omitted later.

Save Results to Disk

export the data to become the current L0 interaction data, overwrite any existing file

# change the name here to save a test file or overwrite previous version
intxns_file_name <- "AvianInteractionData_L0_test.csv"

L0_file <- save_L0_intxns(intxnsL0, 
                          intxns_file_name,
                          L0_dir = file_paths$L0)

L0 file saved:

[1] "/Users/billspat/tmp/Avian-Interaction-Database-Working/L0/AvianInteractionData_L0.csv"
LS0tCnRpdGxlOiAiQXZpYW4gSW50ZXJhY3Rpb24gRGF0YWJhc2U6IEwwIEZpbGUgUHJlcGFyYXRpb24iCm91dHB1dDogaHRtbF9ub3RlYm9vawprbml0OiAoZnVuY3Rpb24oaW5wdXRGaWxlLCBlbmNvZGluZykgewogICAgICBvdXRfZGlyIDwtICJodG1sIjsKICAgICAgcm1hcmtkb3duOjpyZW5kZXIoaW5wdXRGaWxlLAogICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz1lbmNvZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1maWxlLnBhdGgoZGlybmFtZShpbnB1dEZpbGUpLCBvdXRfZGlyKSl9KQotLS0KCmBgYHtyIHNldHVwLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpzdXBwcmVzc01lc3NhZ2VzKHNvdXJjZShoZXJlOjpoZXJlKCdSL0wwL0wwX2Z1bmN0aW9ucy5SJykpKQoKYGBgCgoKLSAgIFBST0pFQ1Q6IEF2aWFuIEludGVyYWN0aW9uIERhdGFiYXNlICYgQXZpYW4gTWV0YS1OZXR3b3JrCi0gICBBVVRIT1JTOiBQaG9lYmUgWmFybmV0c2tlLCBQYXQgQmlsbHMsIEVtaWx5IFBhcmtlcgotICAgQ09MTEFCT1JBVE9SUzogVmluY2VudCBNaWVsZSwgU3RlcGhhbmUgRHJheQotICAgREFUQSBJTlBVVDogRGF0YSBlbnRyeSBDU1YgZmlsZXMgaW4gTDAgZm9sZGVyCi0gICBEQVRBIE9VVFBVVDogTDAgZGF0YTogQXZpYW5JbnRlcmFjdGlvbkRhdGFfTDAuY3N2Ci0gICBEQVRFOiAyMCBNYXIgMjAyMyAtIEFVR1VTVCAyMDI1Ci0gICBOZXh0IHNjcmlwdCB0byBydW46IFIvTDEvQXZpYW5JbnRlcmFjdGlvbkRhdGFfTDEucW1kCgpSdW4gRGF0ZTogYHIgZm9ybWF0KFN5cy5EYXRlKCksICclZSAlQiAlWScpYAoKIyMgSW50cm9kdWN0aW9uCgpUaGlzIHJlYWRzIHRoZSB2YXJpb3VzIGRpcmVjdG9yaWVzIGZvciBDU1ZzIGluIGRpZmZlcmVudCBzdGFnZXMsIGNoZWNrcyB0aGUgZmlsZXMgCmFuZCBjb21iaW5lcyB0aGVtLiAKSXNzdWVzIHdpdGggZmlsZXMgb3IgZGF0YSBhcmUgcmVwb3J0ZWQsIGFuZCB0b3RhbCBjb3VudHMgb2YgZmlsZXMgYW5kIHJvd3MgCmFkZGVkIGFyZSBsaXN0ZWQuIFRoZXJlIGFyZSBkaWZmZXJlbnQgZm9sZGVycyBjaGVja2VkIGhlcmUgaW4gZGlmZmVyZW50IHBoYXNlcyBvZgoKQmVmb3JlIHN0aXRjaGluZyBmaWxlcyB0b2dldGhlciwgcmV2aWV3IGFuZCBjb3JyZWN0IHJhdyBkYXRhIGZpbGVzIChlLmcuIHNwZWNpZXMgQ1NWIGZpbGUpLCB1c2luZyB0aGUgbm90ZWJvb2sgTDBfZmlsZV9yZXZpZXcucm1kCgpUaGUgY29kZSBoZXJlIHNhdmVzIHRoZSBmaWxlIGluIHRoZSBEYXRhIGZvbGRlciBpbiBMMCBpbiB0aGUgY29uZmlndXJhdGlvbiBvZiAKYGZpbGVwYXRocy5SYC4gIHNlZSBiZWxvdwoKIyMjIFNldHVwCgoqRmlyc3QsIHNldHVwIHRoZSBmb2xkZXJzIGFuZCBmaWxlcyBmcm9tIGNvbmZpZ3VyYXRpb24gYW5kIGNoZWNrIHRoZW0qCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBUaGlzIHVzZXMgZnVuY3Rpb25zIGluIFIvTDAvTDBfZnVuY3Rpb25zX2ZpbGVzIHdoaWNoIGFsc28gaW1wb3J0cyBSL2NvbmZpZy5SCiMgd2hpY2ggc2V0cyB0aGUgbG9jYXRpb25zIG9mIHRoZSBkYXRhIGZvbGRlcnMuIAoKZmlsZV9wYXRocyA8LSBnZXRfZmlsZV9wYXRocygpIApgYGAKCgoqKkZpbGUgcGF0aHMgdXNlZCBmb3IgdGhpcyBydW46KioKCmBgYHtyfQpmaWxlX3BhdGhzCmBgYAoKIyMgUHJvY2Vzc2luZyBDU1ZzCgpUaGVyZSBhcmUgdGhyZWUgbWFpbiBkYXRhIGZvbGRlcnMgZm9yIGRhdGEgZmlsZXMgaW4gZGlmZmVyZW50IHN0YXRlcy4gRm9yIGVhY2ggc3RhdGUsIGNvbGxlY3QgdGhlIGxpc3Qgb2YgZmlsZXMgYW5kIG8KCiMjIyAxIEZ1bGx5IENoZWNrZWQgQ1NWIGZpbGVzIGZvciBhIHNwZWNpZXMuIGBpbnR4bnNMMHNwYAoKYGBge3J9CmNzdl9maWxlX2dyb3VwX25hbWU9J2NoZWNrZWQnCmNzdl9maWxlX3BhdGggPSBmaWxlLnBhdGgoZmlsZV9wYXRocyRMMCwgInNwZWNpZXMiKQojIGZpbHRlciBvciBhZGQgaW4gZ29vZ2xlIGRyaXZlIGZpbGVzIGhlcmUKY2hlY2tlZF9maWxlX2xpc3QgPC0gbGlzdC5maWxlcyhwYXRoID0gY3N2X2ZpbGVfcGF0aCAsIHBhdHRlcm4gPSAiLipcXC5jc3YiLCAKICBmdWxsLm5hbWVzID0gVFJVRSkKCnBhc3RlKGNzdl9maWxlX3BhdGgsICI6IiwgY3N2X2ZpbGVfZ3JvdXBfbmFtZSwgImZpbGVzIHRvIHByb2Nlc3MiLCBsZW5ndGgoY2hlY2tlZF9maWxlX2xpc3QpKQpgYGAKClN0aXRjaGluZyBGaWxlcyB0b2dldGhlcjogCgpgYGB7cn0KCmludHhuc0wwc3AgPC0gTDBfc3RpdGNoKAogICAgICAgICAgICAgICAgY3N2X2ZpbGVfbGlzdCA9IGNoZWNrZWRfZmlsZV9saXN0LCAKICAgICAgICAgICAgICAgIGNzdl9maWxlX2dyb3VwX25hbWUgPSBjc3ZfZmlsZV9ncm91cF9uYW1lCiAgICAgICAgICAgICAgICApCgojIGludHhuc0wwc3AgaXMgYSBsaXN0IHdpdGggc2V2ZXJhbCBpdGVtcyB0byB0cmFjayBjb3VudHMgb2YgdGhpbmdzIGFuZCBmaWxlcwojIHNlZSBMMF9mdW5jdGlvbnMuUiBmb3IgZGV0YWlscwpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFfQpwYXN0ZSgiUm93cyBpbiBzdGl0Y2hlZCBmaWxlOiIsIG5yb3coaW50eG5zTDBzcCRpbnR4bnMpKQpgYGAKCk9wdGlvbmFsbHkgZXhhbWluZSB0aGUgZnVsbCBzdGl0Y2hlZCBkYXRhIGZyYW1lOgoKYGBge3IsIGVjaG89RkFMU0V9CnRpYmJsZTo6YXNfdGliYmxlKGludHhuc0wwc3AkaW50eG5zKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFfQpwYXN0ZSgiQ291bnQgb2Ygc3BlY2llcyBhZnRlciBiaW5kaW5nOiIsIGFzLmNoYXJhY3RlcihpbnR4bnNMMHNwJGNvdW50KSkKYGBgCgpDb21wYXJpc29uIG9mIFByZS0gYW5kIFBvc3QtQmluZGluZyBWYWx1ZXM6CgpgYGB7cixlY2hvPUZBTFNFfQpwcmludF9iaW5kaW5nX3JlcG9ydChpbnR4bnNMMHNwKQpgYGAKCiMjIyAyIG5vdCBmdWxseSBDaGVja2VkIFNwZWNpZXMgaW4gQkJTIGBpbnR4bnNMMHNwdGVtcGAKCmBgYHtyfQpjc3ZfZmlsZV9ncm91cF9uYW1lPSdzcGVjaWVzX3RlbXAnCmNzdl9maWxlX3BhdGggPSBmaWxlLnBhdGgoZmlsZV9wYXRocyRMMCwgInNwZWNpZXNfdGVtcCIpCiMgZmlsdGVyIG9yIGFkZCBpbiBnb29nbGUgZHJpdmUgZmlsZXMgaGVyZQp0ZW1wX2ZpbGVfbGlzdCA8LSBsaXN0LmZpbGVzKHBhdGggPSBjc3ZfZmlsZV9wYXRoICwgcGF0dGVybiA9ICIuKlxcLmNzdiIsIAogIGZ1bGwubmFtZXMgPSBUUlVFKQoKcGFzdGUoY3N2X2ZpbGVfcGF0aCwgIjoiLCBjc3ZfZmlsZV9ncm91cF9uYW1lLCAiZmlsZXMgdG8gcHJvY2VzcyIsICBsZW5ndGgodGVtcF9maWxlX2xpc3QpKSAKCmBgYAoKYGBge3J9CgppbnR4bnNMMHNwdGVtcCA8LSBMMF9zdGl0Y2goCiAgICAgICAgICAgICAgICAgICAgY3N2X2ZpbGVfbGlzdCA9IHRlbXBfZmlsZV9saXN0LCAKICAgICAgICAgICAgICAgICAgICBjc3ZfZmlsZV9ncm91cF9uYW1lPWNzdl9maWxlX2dyb3VwX25hbWUKICAgICAgICAgICAgICAgICAgICApCnBhc3RlKCJDb3VudCBvZiBzcGVjaWVzIGFmdGVyIGJpbmRpbmciLGludHhuc0wwc3B0ZW1wJGNvdW50KQoKYGBgCgpgYGB7cixlY2hvPUZBTFNFfQpwcmludF9iaW5kaW5nX3JlcG9ydChpbnR4bnNMMHNwdGVtcCkKYGBgCgojIyMgMyBEYXRhIGZpbGVzIChzcGVjaWVzKSB0byBiZSByZXZpZXdlZCBvciBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyByZXZpZXdlZCBgaW50eG5zTDBzcGlyYAoKYGBge3J9CmNzdl9maWxlX2dyb3VwX25hbWU9J3NwZWNpZXNfaW5fcmV2aWV3Jwpjc3ZfZmlsZV9wYXRoID0gZmlsZS5wYXRoKGZpbGVfcGF0aHMkTDAsICJzcGVjaWVzX2luX3JldmlldyIpCiMgZmlsdGVyIG9yIGFkZCBpbiBnb29nbGUgZHJpdmUgZmlsZXMgaGVyZQppbl9yZXZpZXdfZmlsZV9saXN0IDwtIGxpc3QuZmlsZXMocGF0aCA9IGNzdl9maWxlX3BhdGggLCBwYXR0ZXJuID0gIi4qXFwuY3N2IiwgCiAgZnVsbC5uYW1lcyA9IFRSVUUpCgpwYXN0ZShjc3ZfZmlsZV9wYXRoLCAiOiIsIGNzdl9maWxlX2dyb3VwX25hbWUsICJmaWxlcyB0byBwcm9jZXNzIiwgbGVuZ3RoKGluX3Jldmlld19maWxlX2xpc3QpKQpgYGAKCmBgYHtyfQoKaW50eG5zTDBzcGlyIDwtIEwwX3N0aXRjaCgKICAgICAgICAgICAgICAgICAgY3N2X2ZpbGVfbGlzdCA9IGluX3Jldmlld19maWxlX2xpc3QsIAogICAgICAgICAgICAgICAgICBjc3ZfZmlsZV9ncm91cF9uYW1lPWNzdl9maWxlX2dyb3VwX25hbWUKICAgICAgICAgICAgICAgICAgKSAKCmBgYAoKYGBge3IsLCBlY2hvPUZBTFNFfQpwYXN0ZSgiQ291bnQgb2Ygc3BlY2llcyBhZnRlciBiaW5kaW5nOiIsIGFzLmNoYXJhY3RlcihpbnR4bnNMMHNwaXIkY291bnQpKQpgYGAKCmBgYHtyLGVjaG89RkFMU0V9CnByaW50X2JpbmRpbmdfcmVwb3J0KGludHhuc0wwc3BpcikKYGBgCgpCZWZvcmUgc2F2aW5nIHRoZSBzcGVjaWVzIHRvIGZpbGUsIHVuLWNvbW1lbnQgYW5kIHJ1biB0aGUgZm9sbG93aW5nIHRvIG1lcmdlIHRoZSBzcGVjaWVzIGFuZCBzcGVjaWVzX2luX3JldmlldyBpbnRlcmFjdGlvbiBkYXRhIGludG8gY2hlY2tlZCBzcGVjaWVzLiBUaGVzZSBhcmUgbGlzdHMgd2l0aCB0aGUgZGF0YSBmcmFtZXMgaW4gdGhlIGVsZW1lbnQgYGludHhuc2AKCmBgYHtyfQojIGVjaG8gYm90aCBpbi1yZXZpZXcgYW5kIGNoZWNrZWQKIyBpbnR4bnNMMCA8LXJiaW5kKGludHhuc0wwc3AkaW50eG5zLCBpbnR4bnNMMHNwaXIkaW50eG5zKQojIG9yLCBkbyBub3QgZWNobyBpbi1yZXZpZXcsIG9ubHkgY2hlY2tlZAoKaW50eG5zTDAgPC0gaW50eG5zTDBzcCRpbnR4bnMKCmBgYAoKKipDb3VudCBvZiBzcGVjaWVzIGluIHNhdmVkIEwwOioqCgpgYGB7ciwsIGVjaG89RkFMU0V9CiBucm93KGludHhuc0wwKQpgYGAKCj4gTm90ZSB0aGF0IHNvbWUgc3BlY2llczEgaW4gYSBnaXZlbiBzcGVjaWVzMSBjc3YgY291bGQgYWxzbyBiZSBvdGhlciBzcGVjaWVzIGJlY2F1c2Ugb2YgZW50ZXJpbmcgbWFueSBwYWlyLXdpc2UgaW50ZXJhY3Rpb25zIGluLCBmb3IgZXhhbXBsZSwgbWl4ZWQgZmxvY2sgZW50cnkuIEFueSBkdXBsaWNhdGVzIHdpbGwgYmUgb21pdHRlZCBsYXRlci4KCiMjIyBTYXZlIFJlc3VsdHMgdG8gRGlzawoKZXhwb3J0IHRoZSBkYXRhIHRvIGJlY29tZSB0aGUgY3VycmVudCBMMCBpbnRlcmFjdGlvbiBkYXRhLCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGZpbGUKCmBgYHtyfQojIGNoYW5nZSB0aGUgbmFtZSBoZXJlIHRvIHNhdmUgYSB0ZXN0IGZpbGUgb3Igb3ZlcndyaXRlIHByZXZpb3VzIHZlcnNpb24KaW50eG5zX2ZpbGVfbmFtZSA8LSAiQXZpYW5JbnRlcmFjdGlvbkRhdGFfTDBfdGVzdC5jc3YiCgpMMF9maWxlIDwtIHNhdmVfTDBfaW50eG5zKGludHhuc0wwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnR4bnNfZmlsZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIEwwX2RpciA9IGZpbGVfcGF0aHMkTDApCgpgYGAKCiMjIyBMMCBmaWxlIHNhdmVkOiAKCgpgYGB7ciwgZWNobz1GQUxTRX0KcHJpbnQoTDBfZmlsZSkKYGBgCg==